/**
 * org.assess.core.bean.BaseEntry
 */
package org.assess.core.bean;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @description 一个JavaBean的基类，重写了toString方法
 * @author XiaLongxiang
 * @createtime 2011-12-14 上午10:33:50
 */
public abstract class BaseEntry implements Serializable {
    /** 序列化号 */
    private static final long serialVersionUID = -5964908277803871474L;

    /** ID号，界面使用 */
    protected String id;
    
    /**
     * 重写toString方法，重写后的格式如：[propertyName1=propertyValue1, propertyName2=propertyValue2]
     */
    public String toString() {
        // 获取Fileds数组
        Field[] fields = this.getClass().getDeclaredFields();
        StringBuffer buf = new StringBuffer("[");
        for (Field f : fields) {
            try {
                // 根据Filed对象，获取其相应的Method对象
                Method method = this.getClass().getMethod(toMethodName(f));
                if (method != null) {
                    Object value = method.invoke(this);
                    if (buf.length() > 1) {
                        buf.append(", ");
                    }
                    
                    buf.append(f.getName()).append("=").append(value);
                }
            }
            catch (Exception e) {
            }
        }
        
        return buf.append("]").toString();
    }
    
    /**
     * 将指定的Filed对象转换成它的get方法名称字符串，如Field代表的对象名称是test，则返回getTest，<br>
     * 若test是boolean型，则返回isTest
     * @param field
     * @return
     */
    private String toMethodName(Field field) {
        String name = field.getName();
        // 如果是boolean型，则需要的前缀为is，否则均为get
        String fix = boolean.class == field.getType() ? "is" : "get";
        
        // 如果首字母已经大写，则简单的加上前缀即可，否则将首字母大写
        if (Character.isUpperCase(name.charAt(0))) {
            name = fix + name;
        }
        else {
            name = fix + Character.toUpperCase(name.charAt(0)) + name.substring(1);
        }
        
        return name;
    }
    
    /**
     * 获取ID号
     * @return
     */
    public String getId() {
        return id;
    }
    
    /**
     * 设置ID号
     * @param id
     */
    public void setId(String id) {
        this.id = id;
    }
}
